import { chromium, type Browser, type BrowserContext, type Page } from 'playwright-core'
import mainLogger from '../logger'

/**
 * 浏览器控制器 - 管理浏览器生命周期
 */
export class BrowserController {
  private browser: Browser | null = null
  private context: BrowserContext | null = null
  private page: Page | null = null
  private progressCallback?: (progress: number, message: string) => void

  /**
   * 启动浏览器（使用系统已安装的 Chrome）
   */
  async launch(headless = true): Promise<void> {
    try {
      this.updateProgress(0, '正在启动浏览器...')

      // 使用 channel 参数指定本地 Chrome 浏览器
      this.browser = await chromium.launch({
        headless,
        channel: 'chrome', // 自动查找系统已安装的 Chrome
        args: ['--no-sandbox', '--disable-setuid-sandbox']
      })

      this.updateProgress(30, '浏览器启动成功')
      mainLogger.info('浏览器启动成功', { headless, channel: 'chrome' })
    } catch (error) {
      mainLogger.error('浏览器启动失败', { error })
      throw error
    }
  }

  /**
   * 创建上下文和页面
   */
  async createPage(): Promise<Page> {
    if (!this.browser) {
      throw new Error('浏览器未启动')
    }

    try {
      this.updateProgress(40, '正在创建浏览器上下文...')
      this.context = await this.browser.newContext()
      this.page = await this.context.newPage()
      this.updateProgress(50, '页面创建成功')
      mainLogger.info('页面创建成功')
      return this.page
    } catch (error) {
      mainLogger.error('页面创建失败', { error })
      throw error
    }
  }

  /**
   * 获取当前页面
   */
  getPage(): Page {
    if (!this.page) {
      throw new Error('页面未创建')
    }
    return this.page
  }

  /**
   * 关闭浏览器
   */
  async close(): Promise<void> {
    try {
      this.updateProgress(90, '正在关闭浏览器...')
      if (this.page) await this.page.close()
      if (this.context) await this.context.close()
      if (this.browser) await this.browser.close()
      this.updateProgress(100, '浏览器已关闭')
      mainLogger.info('浏览器已关闭')
    } catch (error) {
      mainLogger.error('浏览器关闭失败', { error })
      throw error
    } finally {
      this.browser = null
      this.context = null
      this.page = null
    }
  }

  /**
   * 设置进度回调
   */
  onProgress(callback: (progress: number, message: string) => void): void {
    this.progressCallback = callback
  }

  /**
   * 更新进度
   */
  private updateProgress(progress: number, message: string): void {
    if (this.progressCallback) {
      this.progressCallback(progress, message)
    }
  }
}
